/**
 * Clase BluetoothServidor: clase destinada a la implementacion del servidor bluetooth en la
 * aplicacion de escritorio J2SE. Utiliza la implementacion BlueCove de la api JSR-82
 */

package infbsimulador.bluetooth;

// Importaciones externas
import org.apache.log4j.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
import java.io.*;


// Importaciones internas
import infbsimulador.errores.*;


public class BluetoothServidor {

    /**
     * Referencia al logueador
     */
    public static Logger logger=Logger.getLogger(BluetoothServidor.class);
    
    /**
     *  Identificador del servicio de simulacion
     */
    public static final UUID SERVICIO_BIOMETRICO=new UUID("F0E0D0C0B0A000908070605040302010", false);
    
    /**
     * Variables de clase para localizar el servlet al que se conectara
     * el servidor bluetooth
     */
    public static String host="192.168.1.106";
    public static String puerto="8080";
    public static String aplicacion="GestionHospitalaria";
    public static String servlet="SimulacionBiometrica";

    /**
     * Atributos
     */
    private LocalDevice dispositivo;
    private String urlServicio;
    private boolean escuchando;
    private StreamConnection cliente;

    /**
     * Constructor de clase
     */
    public BluetoothServidor() {
        // Fabricamos la url de nuestro servicio (a la que posteriormente accederan los clientes)
        urlServicio="btspp://localhost:" + SERVICIO_BIOMETRICO.toString() + ";name=ServicioBiometrico;authorize=false;encrypt=false;authenticate=false";
        escuchando=true;
        ejecutar();
    }

    /**
     * Metodo principal del servidor bluetooth
     */
    public void ejecutar() {
        try{
            dispositivo=LocalDevice.getLocalDevice();
            dispositivo.setDiscoverable(DiscoveryAgent.GIAC);
            logger.debug("Info: El dispositivo se pudo poner en modo visible (GIAC)");
            logger.debug("Info: La direccion del dispositivo es "+dispositivo.getBluetoothAddress());
            StreamConnectionNotifier servidor=(StreamConnectionNotifier)Connector.open(urlServicio);

            // Espera indefinida de conexiones de clientes
            logger.debug("Info: Esperando conexiones entrantes...");
            while(escuchando){
                cliente=servidor.acceptAndOpen();
                logger.debug("Info: Se acepto una conexion cliente...");
                // Por cada conexion entrante lanzaremos una hebra para manejar la conexion entrante
                HebraServidor manejadorConexion=new HebraServidor(cliente);
            }
        }catch(BluetoothStateException bse){
            throw new SimuladorException("Error: Se produjo un error al arrancar el servidor bluetooth de simulacion => "+"Clase: "+bse.getClass()+", Mensaje: "+bse.getMessage());
        }catch(IOException ioe){
            throw new SimuladorException("Error: Se produjo un error al obtener el StreamConnectionNotifier servidor => "+"Clase: "+ioe.getClass()+", Mensaje: "+ioe.getMessage());
        }
    }
}
